package gepes.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import gepes.exepcion.DAOExcepcion;
import gepes.modelo.Clase;
import gepes.modelo.Estudiante;
import gepes.modelo.Profesor;
import gepes.util.ConexionBD;

public class ClaseDAO extends BaseDAO {

	public void elimina(int id) throws DAOExcepcion {
		String query = "delete from  clase where codclase=?";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.ConectarDB();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, id);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
			// Obtener el ultimo id
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public int existe(Clase cl) throws DAOExcepcion {
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select count(0) from clase where Profesor_codProfesor=?"
					+ " and fechaClase=? and horaIni=? and codestudiante=?";

			con = ConexionBD.ConectarDB();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, cl.getProfesor().getCodprofesor());
			stmt.setString(2, cl.getFechaclase());
			stmt.setString(3, cl.getHoraini());
			stmt.setInt(4, cl.getEstudiante().getCodestudiante());
			rs = stmt.executeQuery();
			if (rs.next()) {
				return rs.getInt(1);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return 0;

	}
	public int existePago(Clase cl) throws DAOExcepcion {
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select count(0) from pagoestudiante where codclase=?";

			con = ConexionBD.ConectarDB();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, cl.getCodclase());
			rs = stmt.executeQuery();
			if (rs.next()) {
				return rs.getInt(1);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return 0;

	}
	public int existeAlumno(int idAlumno) throws DAOExcepcion {
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select count(0) from clase where codestudiante=?";

			con = ConexionBD.ConectarDB();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idAlumno);
			rs = stmt.executeQuery();
			if (rs.next()) {
				return rs.getInt(1);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return 0;

	}

	public Collection<Clase> listar() throws DAOExcepcion {

		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		Collection<Clase> lista = new ArrayList<Clase>();
		try {
			String query = "SELECT c.codclase,c.costo,p.apepaterno,"
					+ " p.apematerno,p.nombres, c.codestudiante, e.apepaterno,e.apematerno,"
					+ " e.nombres,c.fechaclase,c.horaini,c.horafin   FROM redgepes.clase c inner "
					+ "join profesor p on  c.Profesor_codProfesor=p.codProfesor inner join Estudiante e on"
					+ " c.codestudiante=e.codestudiante";
			con = ConexionBD.ConectarDB();
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Clase vo = new Clase();
				vo.setCodclase(rs.getInt(1));
				vo.setCosto(rs.getDouble(2));
				Profesor pro = new Profesor();
				pro.setApepaterno(rs.getString(3));
				pro.setApematerno(rs.getString(4));
				pro.setNombres(rs.getString(5));
				vo.setProfesor(pro);
				Estudiante es = new Estudiante();
				es.setCodestudiante(rs.getInt(6));
				es.setApepaterno(rs.getString(7));
				es.setApematerno(rs.getString(8));
				es.setNombres(rs.getString(9));
				vo.setEstudiante(es);
				vo.setFechaclase(rs.getString(10));
				vo.setHoraini(rs.getString(11));
				vo.setHorafin(rs.getString(12));
				lista.add(vo);

			}
			return lista;
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Clase obtener(int id) throws DAOExcepcion {

		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		Clase vo = new Clase();
		try {
			String query = "SELECT c.codclase,c.costo,p.apepaterno,"
					+ " p.apematerno,p.nombres, c.codestudiante, e.apepaterno,e.apematerno,"
					+ " e.nombres,c.fechaclase,c.horaini,c.horafin   FROM redgepes.clase c inner "
					+ "join profesor p on  c.Profesor_codProfesor=p.codProfesor inner join Estudiante e on"
					+ " c.codestudiante=e.codestudiante where c.codclase=?";
			con = ConexionBD.ConectarDB();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, id);
			rs = stmt.executeQuery();
			if (rs.next()) {
				
				vo.setCodclase(rs.getInt(1));
				vo.setCosto(rs.getDouble(2));
				Profesor pro = new Profesor();
				pro.setApepaterno(rs.getString(3));
				pro.setApematerno(rs.getString(4));
				pro.setNombres(rs.getString(5));
				vo.setProfesor(pro);
				Estudiante es = new Estudiante();
				es.setCodestudiante(rs.getInt(6));
				es.setApepaterno(rs.getString(7));
				es.setApematerno(rs.getString(8));
				es.setNombres(rs.getString(9));
				vo.setEstudiante(es);
				vo.setFechaclase(rs.getString(10));
				vo.setHoraini(rs.getString(11));
				vo.setHorafin(rs.getString(12));
			}
			return vo;
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Clase insertar(Clase cl) throws DAOExcepcion {
		String query = "insert into clase(fechaClase,horaIni,horaFin,costo,Profesor_codProfesor,codestudiante) "
				+ "values (?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.ConectarDB();
			stmt = con.prepareStatement(query);
			stmt.setString(1, cl.getFechaclase());
			stmt.setString(2, cl.getHoraini());
			stmt.setString(3, cl.getHorafin());
			stmt.setDouble(4, cl.getCosto());
			stmt.setInt(5, cl.getProfesor().getCodprofesor());
			stmt.setInt(6, cl.getEstudiante().getCodestudiante());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			// Obtener el ultimo id
			int id = 0;
			query = "select last_insert_id()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				id = rs.getInt(1);
			}
			cl.setCodclase(id);

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return cl;
	}

	public Clase actualizar(Clase cl) throws DAOExcepcion {
		String query = "update clase set fechaClase=?,horaIni=?,horaFin=?,costo=? where codClase=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.ConectarDB();
			stmt = con.prepareStatement(query);

			stmt.setString(1, cl.getFechaclase());
			stmt.setString(2, cl.getHoraini());
			stmt.setString(3, cl.getHorafin());
			stmt.setFloat(4, (float) cl.getCosto());			
			stmt.setInt(5, cl.getCodclase());
			System.out.print(cl.getFechaclase());
			System.out.print(cl.getHoraini());
			System.out.print(cl.getHorafin());
			System.out.print(cl.getCosto());
			
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return cl;
	}

}
